from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_core.embeddings.embeddings import Embeddings
from sunbox_embedding_model import CustomEmbeddings  # 导入自定义的 Embeddings 类

text_splitter = SemanticChunker(
   CustomEmbeddings(    # 这里传入自定义的 Embeddings 类
        api_key="sk-0e687ddcf0164a6fb66c1096447223c4",  # 复用相同API密钥
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        model="text-embedding-v3",  # 阿里云支持的嵌入模型
        dimensions=1024
    ),
   breakpoint_threshold_type="percentile",
   # "percentile", 测量句子嵌入之间的差异，并在顶部 X 百分位数处拆分文本。如果句子之间的差异服从正态分布，则该方法拆分最大的 5% 的差异。
   # "standard_deviation", 当差值超过平均值的 X 个标准差时，拆分块。 X 的默认值为 3.0。当文本具有均匀的模式且偶尔会发生重大更改时，此方法非常有用。
   # "interquartile", 使用统计四分位数通过识别语义更改中的异常值来确定分割点。默认缩放因子为 1.5，可通过 breakpoint_threshold_amount 进行调整。
   # "gradient"，使用嵌入距离的梯度来识别分割点，并应用异常检测技术。适用于主题转移细微的领域特定文本（例如，法律或医学文档）。 当文档内容高度自相关时适用。
   breakpoint_threshold_amount=0.75, 
   min_chunk_size=128,
   sentence_split_regex = r"(?<=[.?!。？！\n])\s+",# 分割句子的正则表达式
)

# 测试，读取文档并传入测试
with open(r"Chunk\semantic_chunk\test_senmantic_chunk.txt", encoding="utf-8") as f:
  input_text = f.read()

# 确保 input_text 是字符串类型
if not isinstance(input_text, str):
    input_text = str(input_text)

docs = text_splitter.create_documents([input_text])
# 循环打印docs中的每个分块内容，忽略meatadata
for i, doc in enumerate(docs):
    print(f"\n---Chunk[{i}]---")
    print(doc.page_content)